#include <stdio.h>

void print_data(int *s, int len){
    int i = 0;
    for(i = 0; i < len; i++){
        printf("%d  ", s[i]);
    }
    printf("\n");
}

//一趟排序函数
int my_sort(int *s, int low, int high){
    int temp = 0;//用于交换数据的临时变量
    //每趟排序选最左侧的数据为基准
    //(不一定非要这要选，这样选的好处是写代码方便)
    int flag = s[low];
    while(low < high){
        while(low < high && flag < s[high]){ //如果是降序需要将此处的flag < s[high] 改成 flag > s[high] 即可
            high--;
        }
        //如果上面的循环结束时  low 仍然小于 high
        //说明 是由于 flag < s[high] 不满足而结束的
        //需要交换数据
        if(low < high){
            s[low] = s[high];

            low++;//这样可以少比一次
        }
        while(low < high && flag > s[low]){//如果是降序需要将此处的flag > s[low] 改成 flag < s[low] 即可
            low++;
        }
        //如果上面的循环结束时  low 仍然小于 high
        //说明 是由于 flag > s[low] 不满足而结束的
        //需要交换数据
        if(low < high){
            s[high] = s[low];

            high--;//这样可以少比一次
        }
    }
    //外层循环结束的时候，说明一趟排序已经完成了
    //此时数组的第 low 位的数据就已经确定了自己的位置了
    //将low返回  (或者将high返回也可以  因为此时 low 和 high 是相等的)
    
    //记得别忘了 把 flag 中存的数 塞回原数组
    s[low] = flag;
    
    return low;
}
int count = 0;
//快速排序的函数
int quick_sort(int *s, int low, int high){
    printf("count = %d\n", ++count);
    if(low < high){
        //一趟排序
        int ret = my_sort(s, low, high);
        quick_sort(s, low, ret-1);
        quick_sort(s, ret+1, high);
    }
}

//以升序为例
int main(){
    int s[10] = {6, 4, 7, 9, 3 , 5, 1, 2, 0, 8};
    //排序前
    print_data(s, 10);

    //快速排序操作
    quick_sort(s, 0, 9);

    printf("--------------------------------\n");
    //排序后
    print_data(s, 10);

    return 0;
}
